package com.kt;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

//当你的项目打包成jar，需要永久的运行的时候，就需要使用下面的方法
//nohup java -jar xxx.jar > system.log 2>&1 &
//运行命令后，在同级目录下会出现system.log文件，这个文件就项目的日志文件。
//使用命令：ps -a可以查看Java程序运行的进程号，用于停止程序，
//不过当程序有好几个的时候，用命令：ps -ef|grep java这个命令会将搜索Java相关的所以进程号，
//根据jar包名称找到需要停止的进程号，使用命令：kill -9 11759杀死进程，11759是进程号。
//（PS：杀死进程时一定要注意不要看错了进程号，以免杀错！！）

@SpringBootApplication
//自动配置
@EnableAutoConfiguration
//扫描包
@ComponentScan(basePackages = {"com.kt.controller","com.kt.service"})
//扫描bean包
@EntityScan(basePackages = {"com.kt.po"})
//jpa扫描dao包
@EnableJpaRepositories(basePackages = {"com.kt.dao"})
//mybatis扫描dao包
@MapperScan(basePackages = {"com.kt.dao"})
public class App extends SpringBootServletInitializer{
    /**
     * 打war包初始化
     * 修改启动类，继承 SpringBootServletInitializer 并重写 configure 方法
     */
	@Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(App.class);
    }

	public static void main(String[] args) {
		//disableAccessWarnings();
		SpringApplication.run(App.class, args);
	}

	/**
	 * 去除非法反射警告
	 */
	@SuppressWarnings("unchecked")
	public static void disableAccessWarnings() {
		try {
			Class unsafeClass = Class.forName("sun.misc.Unsafe");
			Field field = unsafeClass.getDeclaredField("theUnsafe");
			field.setAccessible(true);
			Object unsafe = field.get(null);

			Method putObjectVolatile = unsafeClass.getDeclaredMethod("putObjectVolatile", Object.class, long.class, Object.class);
			Method staticFieldOffset = unsafeClass.getDeclaredMethod("staticFieldOffset", Field.class);

			Class loggerClass = Class.forName("jdk.internal.module.IllegalAccessLogger");
			Field loggerField = loggerClass.getDeclaredField("logger");
			Long offset = (Long) staticFieldOffset.invoke(unsafe, loggerField);
			putObjectVolatile.invoke(unsafe, loggerClass, offset, null);
		} catch (Exception ignored) {
		}
	}

}